package com.jiajia.study.chapter01.nio;

import com.jiajia.study.utils.ByteBufferUtil;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;

/**
 * 网络编程 - 非阻塞模式 - server 端
 * @author zjiajia
 * @date 2024/7/5 10:58
 */
public class TestServerV2 {
    public static void main(String[] args) throws IOException {
        ByteBuffer byteBuffer = ByteBuffer.allocate(32);
        // 创建 server 端
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        // 非阻塞模式
        serverSocketChannel.configureBlocking(false);
        // 绑定端口
        serverSocketChannel.bind(new InetSocketAddress(8888));

        // 连接集合
        List<SocketChannel> channels = new ArrayList<>();

        while (true){
            /**
             * 默认这个方法是阻塞的，新的连接过来才会继续往下执行
             *
             * 非阻塞模式：
             *      socketChannel 是 null
             */
            SocketChannel socketChannel = serverSocketChannel.accept();
            if(socketChannel != null){
                // 非阻塞模式
                socketChannel.configureBlocking(false);
                channels.add(socketChannel);
                for(SocketChannel sc : channels){
                    /**
                     * 默认 read 也是阻塞，只有 client 有数据写入，才会往下执行
                     *
                     * 非阻塞模式 ：
                     *      根据返回结果来判断
                     *      -1 表示读取到数据尾部
                     *      0  表示没有数据可读
                     */
                    int read = sc.read(byteBuffer);
                    if(read > 0){
                        // 切换成写模式
                        byteBuffer.flip();
                        ByteBufferUtil.debugRead(byteBuffer);
                        // 切换成写模式
                        byteBuffer.clear();
                    }
                }
            }

        }
    }
}
